#include <iostream>
#include <memory>

struct Foo
{
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
    void bar() { std::cout << "Foo::bar\n"; }
};

void test_shared_ptr(std::shared_ptr<Foo> &dst)
{
    std::shared_ptr<Foo> ptr1(new Foo); // 创建 std::shared_ptr，并分配一个 Foo 对象
    ptr1->bar();                        // 使用 Foo 对象

    // 创建一个新的 std::shared_ptr，它指向与 ptr1 相同的对象
    std::shared_ptr<Foo> ptr2;
    ptr2 = ptr1; // 赋值操作
    ptr2->bar();

    // 当 ptr1 和 ptr2 离开作用域时，它们所指向的 Foo 对象将被自动删除

    dst = ptr1;
}

void test_shared_ptr_by_param()
{
    std::shared_ptr<Foo> ptr3;
    test_shared_ptr(ptr3);
    ptr3->bar();
}

int main()
{
    test_shared_ptr_by_param();
    return 0;
}

/*
Foo::Foo
Foo::bar
Foo::bar
Foo::bar
Foo::~Foo
 */